package com.dwd.hrm.service.impl;

import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.dwd.hrm.constant.CourseConstant;
import com.dwd.hrm.domain.CourseType;
import com.dwd.hrm.domain.CrumbsVo;
import com.dwd.hrm.mapper.CourseTypeMapper;
import com.dwd.hrm.query.CourseTypeQuery;
import com.dwd.hrm.service.ICourseTypeService;
import com.dwd.hrm.util.PageList;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * <p>
 * 课程目录 服务实现类
 * </p>
 *
 * @author wendi
 * @since 2021-03-05
 */
//@Service
public class CourseTypeServiceImpl_rollback extends ServiceImpl<CourseTypeMapper, CourseType> implements ICourseTypeService {
    @Autowired
    private CourseTypeMapper courseTypeMapper;
    @Autowired
    private RedisTemplate redisTemplate;

    @Override
    public List<CourseType> queryTree() {
        //sql查询
        //return courseTypeMapper.queryTree();
        //从redis查询是否有缓存，没有区数据库查询，然后放入redis
        Object obj = redisTemplate.opsForValue().get(CourseConstant.COURSE_TYPE_CACHE);
        //有缓存
        if (obj != null) {
            System.out.println("redis");
            System.out.println();
            List<CourseType> courseTypeList = (List<CourseType>) obj;
            return courseTypeList;
        } else {
            System.out.println("mysql");
            //数据库查询
            List<CourseType> list = queryTreeMethod();
            //放入redis 设置60分钟
            redisTemplate.opsForValue().set(CourseConstant.COURSE_TYPE_CACHE, list,60, TimeUnit.MINUTES);
            return list;
        }
    }

    @Override
    public PageList<CourseType> queryPage(CourseTypeQuery query) {
        return null;
    }

    @Override
    public List<CrumbsVo> getCrumbs(Long courseTypeId) {
        return null;
    }

    private List<CourseType> queryTreeMethod() {
        //返回结果
        List<CourseType> result = new ArrayList<>();
        //查询所有
        List<CourseType> courseTypes = courseTypeMapper.selectList(null);
        //遍历 进行id和对象的一对一对应
        Map<Long, CourseType> typeHashMap = new HashMap<>(16);
        courseTypes.forEach(courseType -> {
            typeHashMap.put(courseType.getId(), courseType);
        });
        //遍历把子节点放入父对象的children中
        courseTypes.forEach(courseType -> {
            //判断是否有子节点
            if (courseType.getPid().intValue() == 0) {//没有子节点
                //加入返回结果
                result.add(courseType);
            } else {//有子节点
                //获取父节点对象
                CourseType type = typeHashMap.get(courseType.getPid());
                //添加子节点
                type.getChildren().add(courseType);
            }
        });
        return result;
    }

    /**
     * 增删改之前都删除缓存
     * @param entity
     * @return
     */
    @Override
    public boolean insert(CourseType entity) {
        redisTemplate.delete(CourseConstant.COURSE_TYPE_CACHE);
        return super.insert(entity);
    }

    @Override
    public boolean deleteById(Serializable id) {
        redisTemplate.delete(CourseConstant.COURSE_TYPE_CACHE);
        return super.deleteById(id);
    }

    @Override
    public boolean update(CourseType entity, Wrapper<CourseType> wrapper) {
        redisTemplate.delete(CourseConstant.COURSE_TYPE_CACHE);
        return super.update(entity, wrapper);
    }
}
